﻿using System;
using System.Collections.Generic;
using System.Linq;

namespace CRM.Database.Model
{
    public class GeometriesCollection : AbstractCollection
    {
        /// <summary>
        /// Список всех геометрий
        /// </summary>
        public List<Geometries> GeometriesList
        {
            get
            {
                return Entities.Geometries.ToList();
                // return DB.Entities.Geometries.OrderBy(geometry => geometry.Geometry).ToList();
            }
        }


        /// <summary>
        /// Получение геометрии по имени
        /// </summary>
        /// <param name="name">Имя геометрии</param>
        /// <returns>Геометрия</returns>
        public Geometries GetGeometryByName(string name)
        {
            return GeometriesList.FirstOrDefault(geometry => geometry.Geometry == name);
        }


        /// <summary>
        /// Получение геометрии по идентификатору
        /// </summary>
        /// <param name="geometryId">Идентификатор</param>
        /// <returns>Геометрия</returns>
        public Geometries GetGeometryById(int geometryId)
        {
            return GetItemById(geometryId) as Geometries;
        }

        #region Implementation of IGetIdByName

        /// <summary>
        /// Получение идентификатора по имени
        /// </summary>
        /// <param name="name">Имя</param>
        /// <returns>Идентификатор</returns>
        public int GetIdByName(string name)
        {
            return (from item in GeometriesList where item.Geometry == name select item.IdGeometry).FirstOrDefault();
        }

        /// <summary>
        /// Получение списка элементов
        /// </summary>
        /// <returns>Список элементов</returns>
        public override List<object> GetList()
        {
            return new List<object>(GeometriesList);
        }

        #endregion

        #region Implementation of IGetItem

        /// <summary>
        /// Получение типа текущего элемента
        /// </summary>
        /// <returns></returns>
        protected override Type GetItemType()
        {
            return typeof (Geometries);
        }

        /// <summary>
        /// Получение статического списка для хранения объектов
        /// </summary>
        /// <returns></returns>
        public override object GetStaticCollection()
        {
            throw new NotImplementedException();
        }

        /// <summary>
        /// Получение элемента из коллекции по идентификатору
        /// </summary>
        /// <param name="itemId">Идентификатор</param>
        /// <returns>Элемент</returns>
        public override object GetItemById(int itemId)
        {
            return Entities.Geometries.Find(itemId);
        }

        #endregion

        #region Implementation of IAddDeleteUpdate

        /// <summary>
        /// Обновление элемента в коллекции
        /// </summary>
        /// <param name="item">Новый элемент</param>
        /// <param name="userLogin">Логин пользователя, который делает изменения</param>
        /// <returns>Результат операции</returns>
        public bool Update(object item, string userLogin)
        {
            var newGeometry = (Geometries) item;
            if (newGeometry == null)
                return false;


            var geometry4Update = GetItemByIdFromDatabase(newGeometry.IdGeometry) as Geometries;

            if (geometry4Update == null)
                return false;

            if (!string.IsNullOrEmpty(newGeometry.Geometry))
                geometry4Update.Geometry = newGeometry.Geometry;

            geometry4Update.IsActive = newGeometry.IsActive;


            return base.Update(geometry4Update, userLogin);
        }

        /// <summary>
        /// Обнуление статической коллекции
        /// </summary>
        protected override void SetStaticListToNULL()
        {
            throw new NotImplementedException();
        }

        #endregion
    }
}